Skip to main content

Full text of "Aprende A Programar - Animación (Ediciones Anaya, 1986)"

See other formats


APRENDE 4 PROGRAMAR 


ANIMACIÓN 














Diseño: Cooper West 
Edición: Nigel Cawthorne 
Programas: Marcus Milton 
David Rosam 
Programas MSX Angel García García 
Ilustraciones: Gerard Brown 


Traducción: Angel García García 


El traductor desea expresar su agradecimiento a 
Gustavo Flores Maza por su colaboración en este libro 


Queda prohibida la reproducción total o parcial de la presente obra bajo 
cualquiera de sus formas, gráfica o audiovisual, sin la autorización previa y 
escrita del editor, excepto citas en revistas, diarios o libros, siempre que se 
mencione la procedencia de las mismas. 


Título original: COMPUTER ANIMATION 

O 1985, Aladdin Books Ltd. 

O 1986, de la edición española, E. G. Anaya. 
Villafranca, 22. 28028 Madrid. 

I.S.B.N.: 84-7525-361-X. 

Depósito legal: M. 20984-1986 

Impreso por: Edime, S. A. Calle D, esquina a F. 
Polígono Industrial Arroyomolinos. Móstoles (Madrid) 
Impreso en España - Printed in Spain. 


APRENDE A PROGRAMAR 


ANIMACIÓN 









Marcus Milton 





ANAYA 


AS 


























Introducción 


Los gráficos por ordenador encierran muchas más sorpresas de 
las que te puedes imaginar. En lugar de limitarte a Jugar o ilustrar 
tus juegos puedes incluso escribir una historia, y construir tu 
propio programa lleno de color y gráficos tanto estáticos como 
animados. El programa se da para el sistema MSX y para el 
Spectrum y cuenta la historia de la Casa Encantada. 

El programa ha sido dividido en bloques lógicos, y un texto 
paralelo explica cómo funciona cada sección. Escribir un 
programa en bloques lógicos no sólo lo hace más sencillo de 
entender tanto para ti como para otras personas; también reduce 
las posibilidades de error del mismo. Al finalizar determinadas 
secciones puedes probar lo que acabas de teclear; ten en cuenta 
que incluso el error más pequeño puede hacer que el programa 
no funcione. Si algo falla repasa los listados cuidadosamente. 
Asegúrate de que tu programa coincide con el del libro. Los 
siniestros acontecimientos que tienen lugar en la Casa Encantada 
emplean técnicas muy útiles de programación de gráficos. Por 
ejemplo, con un cuidadoso diseño de determinados caracteres 
definidos por el usuario en el Spectrum es fácil conseguir, 
mediante un programa en BASIC, un movimiento muy suave de 
las figuras. 


A 


Contenido 


Gráficos MSX 


Gráficos Spectrum 


El escenario 












10 
12 





PROGRAMA DE CONTROL E INICIALIZACION 13 
MSX 14 
SPECTRUM , 16 
DIA 19 
MSX 20 










SPECTRUM 


En I=LEN 
$ RETURN (R$) 








HEN VB 
y $= 
?* GOSUB 1500. TS(R$, 3), 


Gráficos MSX 


EL BASIC del MSX permite animar figuras de una manera muy 
simple mediante el uso de sprites. Estos son caracteres cuya 
forma podemos definir y mover por la pantalla. Podemos definir 
cuatro tipos de sprites: 8x8, 8x8 aumentado, 16x16 y 16x16 
aumentado, según el número de pixels (puntos de la pantalla) y el 
tamaño de éstos. 


Veamos sobre un ejemplo cómo definir un sprite y cómo moverlo 
por la pantalla. 


SCREEN 2,2 
FOR I=1 TO 32:READ N:A$=A9$+CHR$ (N) : NEXT 

SPRITES (1)=4$ 

FOR J=240 TO 1 STEP -1:PUT SPRITE 1,(J,1): 

FOR I=1 TO 50:NEXT: NEXT 

GOTO 46 

DATA 0,0,0,112,120,60,30,127,255,255,127,1,0,0,0,0, 
0,9,9,4,14,30,62,254,255,255,254,254,240,120,60,28 


O 
06000 


O 





La línea 10 selecciona el modo de pantalla 2 —modo gráfico de 
192x256 pixels— y los sprites de tipo 16x16. En las líneas 20 y 30 
definimos el sprite leyendo los 32 datos necesarios (pues para el 
sprite de 16x16 necesitamos 32 bytes) y asignando una cadena de 
caracteres a la variable SPRITE $. El argumento de esta variable 
(1 en este caso) selecciona el plano de definición de ese sprite. 
Para entenderlo imaginemos la pantalla del monitor o televisor 
compuesta por una serie de capas (PLANOS). Las imágenes en 
los planos más cercanos al observador —planos inferiores— 
parecen pasar por delante de las de los que se encuentran en 
planos posteriores. La línea 40 se encarga de mover el sprite por 
la pantalla; para ello indicaremos, en este orden, de qué sprite se 
trata, sus coordenadas y el color en que queremos que se 
imprima. 


Después de los planos de sprites se encuentra el “plano 
multicolor”. En él es donde aparecen las imágenes creadas por 
manejo de textos y los comandos gráficos usuales PRINT, 
DRAW, LINE... No obstante podemos modificar las imágenes 
que aparecen en este plano para crear figuras más sofisticadas 
como los árboles que veremos en la Casa Encantada. 


Para ello hay que acceder directamente a la memoria de vídeo del 
ordenador. El proceso es relativamente complejo y aquí sólo 
pretendemos dar una idea general del mismo. Toda imagen en la 
pantalla viene definida por las posiciones de memoria de la VRAM 








































(memoria de vídeo). En el modo 2 (gráfico) ésta se divide en cinco 
bloques: tabla de patrones, que nos da la definición de cada 
carácter en la pantalla de forma análoga a la de los sprites; tabla 
de nombres, que nos indica para cada posición de pantalla dónde 
se encuentra en la tabla de patrones la definición de dicha 
posición; tabla de colores, que nos da el color de fondo y de 
primer término de cada byte —8 pixels horizontales— de la tabla 
de patrones; tabla de patrones de sprites, sobre la que 
podemos actuar directamente para definir los sprites y, por fin, la 
tabla de atributos de sprites, que nos da la posición, color y 
número de patrón de cada sprite. 


Veamos el proceso que hay que seguir para crear una imagen en 
el plano de fondo. En primer lugar definiremos en la tabla de 
patrones la figura que pretendemos obtener de una forma análoga 
a la de definición de sprites. A continuación indicaremos en la 
tabla de nombres para las posiciones de carácter que 
pretendemos que tengan esa forma que el patrón se encuentra a 
partir de un lugar determinado de la tabla de patrones. Por último, 
si queremos, podemos modificar el color de cada carácter 
actuando sobre la tabla de colores. 





Aunque el proceso pueda parecer bastante complejo, si lo 
manejamos con cuidado podemos llegar a obtener resultados 
sorprendentes. No obstante conviene acudir a un libro 
especializado para profundizar debidamente en el tema. 





LA BASE DE LA DEFINICIÓN 
DEL SPRITE DE 16x16 

SON CUATRO CUADRADOS 
DE 64 PIXELS 





AA E OA 
Gráficos Spectrum 


La forma usual de animar un cáracter desde el BASIC en el 
Spectrum es imprimir la figura, borrarla y volverla a imprimir en 
una posición contigua. Generalmente el efecto de movimiento no 
es muy bueno, pues la figura parece moverse a saltos. Y lo que es 
peor, las figuras no pueden moverse uno o dos pixels cada vez 
(deben localizarse en filas y columnas). No obstante, si 
imprimimos tres o cuatro formas apropiadas en el espacio de dos 
caracteres podemos crear la ilusión de que la figura se está 
moviendo sólo unos pocos pixels cada vez. Podemos conseguir un 
movimiento suave, libre de saltos, repitiendo este proceso sobre 
posiciones sucesivas de la pantalla. 


Prueba este programa. 




















FOR A=65348 TO 65439 ¿READ D: POKE A,D: NEXT A 
20 DATA 24,12,134,255,255,134,12,24: REM (A) 

30 DATA 0,0,09,240,240,0,0,0: REM (B) 

40 DATA 6,3,33,63,63,33,3,6:2 REM (0) 

50 DATA 0,0,128,252,252,128,0,0:REM (D) 

50 DATA 1,0,8,15,15,8,0,1: REM (E) 

70 DATA 128,192,96,255,255,96,192,128: REM (F) 

86 DATA 0,0,2,3,3,2,0,0: REM (6) 

90 DATA 95,48,24,255,255,24,48,96: REM (H) 

100 DATA 0,6,0,192,192,0,0,0:REM (1) 


$ 
O 


66 





O 




































































































































10 








FOR F=6 TO 28 
FRINT AT 2,P3” AB": PAUSE 3 
FRINT AT 2,5". CD" PAUSE = 


FRINT AT 2,P5" EF": PAUSE 3 
PRINT AT 2,P53" GHI": PAUSE 3 
NEXT P 


Las líneas 110 a 160 mueven el avión suavemente por la pantalla. 
El secreto es que en realidad hay cuatro gráficos que parecen 
iguales, excepto porque están situados en posiciones diferentes. 
Cada gráfico se construye con dos o tres caracteres definidos por 
el usuario (líneas 120 a 150). La figura que se imprime en la línea 
130 está localizada dos pixels a la derecha de la figura impresa en 
la línea 120; la figura de la línea 140 está situada dos pixels a la 
derecha de la de la línea 130, y así sucesivamente. El lazo entre 
las líneas 110 y 160 mueve el avión por la pantalla. El conjunto de 
caracteres definidos por el usuario que se imprimen en las líneas 
120 a 150 es como una minisecuencia animada (al imprimir 
rápidamente la secuencia de gráficos de avión conseguiremos que 
éste parezca moverse incluso dentro de un sólo carácter). El lazo 
se limita a presentar en pantalla esta minisecuencia animada en 
cada carácter de la línea. El carácter que imprimimos justo antes 
de cada grupo de caracteres borra la última parte de la cola del 
avión, que de no ser así quedaría atrás según se mueve éste por 
la pantalla. 


EL MOVIMIENTO DEL AVIÓN 

SE CONSIGUE ¡MPRIMIENDO 
LA SERIE DE GRÁFICOS DE LA 
DERECHA. TODAS LAS FIGURAS 
SON IGUALES PERO ; 
COLOCADAS EN UNA POSICIÓN 
DIFERENTE 














el 








El escenario 


Antes de comenzar con el programa tenemos que elaborar el 
argumento o guión de nuestra historia. El programa da vida a una 
casa encantada y comienza por dibujar la imagen de una casa 
antigua rodeada de un bosque fantasmagórico. Cae la noche... un 
rayo atronador despierta a los murciélagos del campanario y una 
vieja bruja sobrevuela la casa en su escoba. Mientras vuela en la 
noche caen más rayos y relámpagos, que alcanzan la casa y 
provocan el fuego en una de las torres. Las llamas se extienden y 
la casa entera se derrumba. Como dramática conclusión de la 
historia una tétrica calavera se alza sobre sus ruinas. La secuencia 
dura unos minutos. Conviene dibujarse un guión como el de abajo 
en un papel, de forma que puedas dividir el argumento en escenas 
y sucesos separados. 


CASA ENCANTADA 


LA CASA SE DERRUMBA 


LA CASA ARDIENDO 


APARECE LA CALAVERA 











EL PROGRAMA 
DE CONTROL 
Y LA INICIALIZACION 


Una vez que hayas planeado la historia puedes escribir el programa 
de control. Este te permite estructurar tu programa, dividiendo 
cada sección en una serie de bloques más pequeños y manejables. 
Esto lo conseguirás mediante el empleo de subrutinas. La primera 
sección te muestra cómo escribir el programa de control y preparar 
el ordenador para el comienzo de la animación. 








rrroreno oe ts 
CCT AAA AEREA GAIA, 

ACA PAR recio, 
OC er As RCA ras 














La estructura del programa de control se ajusta al argumento. La 
mayoría de las subrutinas se utilizan una sola vez, como las 
empleadas para dibujar el castillo y los árboles. Las únicas 
subrutinas que se repiten son las llamadas en las líneas 100 y 110. 
Con ellas conseguimos mover el murciélago y la bruja por la 
pantalla. 


REM Casa Encantada 

CLEAR 200, 61482! 

SCREEN 2,2:COLOR 1,3,1:0L5 
GOSUB £500:REM Inicializar 
GOSUB 20668:REM Fondo 

GOSUB 2500:REM Castillo 
GOSUB 45006:REM Arboles 
GOSUB 590%: REM Oscuridad 
N=4:GOSUB 1500:REM Rayo 
M=17300 

FOR XB=9 TO 254 STEP 2 
GOSUR 500:REM Murcielago 
GOSUB 1000:REM Bruja 

IF XB=254 THEN FUT SPRITE 2,(0,209) 
NEXT XB 

N=4:GOSUB 15060: REM Rayo 
GOSUB 5500:REM Fuego 
GOSUB £6006:REM Calavera 
END 


0000000 


El programa de control se limita a llamar consecutivamente a una 
serie de subrutinas para conseguir el dibujo en la pantalla. En la 
línea 70, antes de llamar a la subrutina Rayo establecemos el 
valor de N que será empleado por ésta para determinar el número 
de relámpagos. Asimismo la línea 80 actúa sobre la variable M 
necesaria en la subrutina Murciélago. Es conveniente trabajar de 
esta forma con las subrutinas, pues así se hacen mucho más 
flexibles. 


REM Inicializar 

FOR 1=61483' TO £1508! 

READ N$:FOKE I,VAL("2£H"+N$) 2 NEXT 
DEFUSR=61 4323! 

FOR I=BASE(12) TO BASE(12)+15: READ 
VFOKE (14+44096),N: NEXT 

FOR I=BASE(12? TO BASE(12)+15:READ 


O 


VFOKE (14+4352),N: NEXT 

FOR I=BASE(12) TO BASE(12)+15:READ 
VPOKE (1+4409),N: NEXT 

FOR I=BASE (14)+32 TO BASE (14)+191:READ N: 
VPOKE I,N: NEXT 
RETURN 


00 


6 


Ni 


N: 


N: 





60000 





14 








7600 


7010 


702 


7030 


7040 


7050 


70656 


70670 


7086 


345000000000 


La subrutina Inicializar comienza en la línea 6500. Las líneas 6510 
y 6520 se encargan de leer los datos necesarios para configurar un 
programa en código máquina que emplearemos para cambiar 
instantáneamente los colores de la pantalla. La línea 6530 fija la 
dirección a donde queremos llamar al comando USR. Las líneas 
6540 a 6560 establecen la definición del árbol accediendo a la tabla 
de patrones y actuando sobre la misma. La línea 6570 modifica las 
posiciones correspondientes a la tabla de patrones de sprites 
generando así los correspondientes al murciélago (dos), la bruja, la 
luna y la llama. 


Antes de continuar adelante graba el programa en cinta o disco, 
ya que un error en esta etapa puede bloquear por completo el 


ordenador. 


e. 


DATA DB,79,21,00,20,0E,99,ED,69,ED,61,21,00,00,7E, 
14,D3,98,23,7C,FE, 18,C2,39,F0,C9:REM Cod. maquima 

DATA 16,129,73,40,16,80,48,9,128,32,74,134,164,683, 
204,30,5,:38,178,27,31,15,3,3,48,96,192,192,194,244 
io z 128, 1d. 1133. 3 7 0d 315172. 172172) 1209120, 128 
1,224,252: REM Arbol 

DATA 0,0,0,16,56,125,235,63,15,3,2,0,0,0,0,0,0,0,0 
,3,28,190,255,252,240,192,564,0,0,0,0,0: REM Murc. 1 

DATA 0,0,0,0,0,13,31,673,63,67,26,24,8,0,0,0,0,0,0, 
0,0, 1765,248,2532, 252, 252,88,24,16,0,0,0:REM Murc. 2 

DATA 7+1,0,0,0,1,3,13979, 207,239 173,127) 1510,0,0, 12 

,192,96,96,224,192,192,224,240,255, 192,128, 128,192 
,9,0:REM Bruja 

DATA 3,14,28,56, 122,120,254,255,2535,248,248,96,1092 
135,31,3,0,0,0,0,128,0,0,128, 128,0,0,4,12,152,248, 
240: REM Luna 

DATA 0:32. 32+34, 30331) 31,127,123, 236,2281100,33, 3 

371710,0,17,1/,49,115,227,167,167,191,186,164,200, 
268,224,224: REM Llama 

DATA 521,535,5460,547,550,562,565,570,580,592,600, 

610,637,646,657,661,667,636,691,696,700: 

REM Posicion arboles 

DATA 177,48,169,64,1479,84,91,84,71,64,63,48: 

REM Posicion llamas 


Ed 5 
LoS ARBOLES SE 


ACCEDIENDO 


15 


060000000000 





DIR 


UJAN 
DIRECTAMENTE 
AM 








La estructura del programa de control se ajusta al guión. La 
mayoría de las subrutinas se emplean una sola vez, como la usada 
para dibujar el castillo y los árboles. Las únicas subrutinas que se 
repiten son llamadas en las líneas 100 y 110 dentro del bucle 
FOR... NEXT constituido por las líneas 90 a 130. Estas 
subrutinas mueven el murciélago y la bruja unos pocos pixels 
cada vez que son ejecutadas. 


REM e RR RA 

REM casa encantada 

REM 18 bytes de codigo mequima alma 
linea 5 

GO SUB 5500: 

GO SUB 2006: 

SO SUB 2500: 

GO SUB 4500: 

GO SUR 5006: 

LET n=5: GO SUB 1500: 

LET m=133%0 

FOR b=6 TO 29 

GO SUE 506: REM murcielago 

GO SUB 10660: REM bruja 

IF b=292 THEN FRINT AT 1,2903" 

NEXT b 

LET n=S: €O0 SUB 1506: 

GO SUB 5506: REM fuego 

GO SUB 4066: REM calavera 

STOP 


REM inicializar 
REM fondo 

REM castillo 

REM arboles 

REM oscuridad 

REM rayo 


REM rayo 


600000060 


Como puedes observar en la línea 70 establecemos el valor de la 
variable n antes de entrar en la subrutina que dibuja el rayo. El 
valor de n nos dará el número de rayos a dibujar en esa subrutina 
(ver página 35). Es una buena técnica de programación escribir de 
esta forma las subrutinas que vamos a emplear bastante en el 
programa, ya que serán mucho más flexibles y versátiles. La línea 
80 establece el valor de la variable m a su valor inicial antes de ser 
empleada en el bucle que mueve el murciélago y la bruja. Se ha 
preferido establecer su valor aquí en lugar de en la subrutina de 
inicialización para distinguir a qué parte del programa pertenece. 
La línea 120 se limita a imprimir tres espacios; éstos se emplean 
para borrar la bruja cuando esta alcanza la última posición de su 
trayectoria. 


REM inicializar 








FOR a=65368 TC £5527: 
REM introducir codigo 
REM de la linea 5 

FOR i=23760 TO 223777: 
RETURN 


READ di POKE ad: NEXT a 
maquina en la sentencia 


READ d: NEXT i 


POKE i,d: 





16 

















700% DATA 16,129,77,40,16,80,48,9: REM arbol (A) 
7010 DATA 128,32,74,134,164,68,204,306: REM arbol (B) 
7020 DATA 5,38,178,27,31,15,3,3: REM arbol (0) 

7030 DATA 48,96,192,192,192,244,152,128: REM arbol (D) 
7040 DATA 1,1,1,3,3,7,31,51: REM arbol (E) 

7056 DATA 192,192,192,128,128,128,224,252: REM arbol (F) 
7060 DATA 8,16,48,32,96,96,233,224: REM luna (6) 

7070 DATA 240,254,127,1173,48,54,31,6: REM luna (H) 


00 











35000 







La línea 6500 es el comienzo de la subrutina de inicialización. La 
línea 6510 lee los datos dados en las líneas 7000 a 7190 y los sitúa 
en las direcciones especiales reservadas para caracteres definidos 
por el usuario. Las letras entre paréntesis que hay detrás de cada 
línea de datos te indican en qué letra en modo gráfico se ha 
guardado cada carácter. La línea 6530 lee los datos de las líneas 
7510 y 7520 y los emplea para crear una pequeña rutina en código 
máquina. Este programa nos permite cambiar instantáneamente 
determinados colores de la pantalla cuando se necesita cambiar la 
escena de día a noche. Una vez que hayas tecleado hasta la línea 
7540 comprueba con mucho cuidado lo que acabas de escribir, ya 
que cualquier error en esta etapa puede bloquear el ordenador al 
intentar rodar el programa. Lo único que puedes hacer si esto 
ocurre es desconectarlo y comenzar de nuevo. De ahí que sea 
conveniente guardar el programa en cinta al finalizar esta etapa, LOS ARBOLES SE DIBUJAN A BASE 
de modo que simplemente debas cargarlo de nuevo en lugar de DE CARACTERES DEFINIDOS 
volverlo a teclear si algo ha fallado. POR E USUAnIa 











7030 DATA 1,2,6,230,19,255,17,226: REM bruja (1) 
7090 DATA 0,6,0,128,240,128,0,06: REM bruja (J) 
7106 DATA 9,0,1,57,4,31,4,56: REM bruja (K) 

71106 DATA 64,129, 128,150,252,224,64,128: REM bruja (L) 
7120 DATA 04,0,0,14,1,7,1,14: REM bruja (M) 

7136 DATA 16,32,796,164,63,248,16,32: REM bruja (N) 
7146 DATA 0,0,0,3,0,1,0,3: REM bruja (0) 

7150 DATA 4,8,24,154,79,254,68,136: REM bruja (F) 
7160 DATA 9,0,0,0,192,0,0,0: REM bruja (0) 

7170 DATA 9,0,0,66,36,24,24,0: REM murcielago (R) 
7186 DATA 0,0,0,0,0,235,24,6: REM murcielago (S) 
7190 DATA 8,128,65,2,150,68,20,40: REM llamas (T) 
7300 REM datos codigo maquina 

7510 DATA 62,06,33,0,88,6,24,197,6,32 

3209 DATA 119,35,16,252,193,16,245,201 

7330 REM datos posicion ventanas 

7340 DATA 10,22,8,23,14,19,14,127,10,79,8,8 














Ó0O0000O 





17 


SD 
O 
> 


Algunos de los caracteres del programa son creados empleando 
varias figuras; así, los árboles están constituidos por seis 
sentencias DATA que definen seis caracteres definidos por el 
usuario, como se muestra en la página anterior. La bruja, sin 
embargo, consta de nueve caracteres en total, ya que es animada 
empleando la misma técnica que la del avión en la página 10. 


Puedes animar la forma que quieras empleando un programa 
similar y dibujando el gráfico en un diagrama como el que se 
muestra a continuación, imprimiendo las figuras en diferentes 
posiciones. 




























TT] LA BRUJA ES ANIMADA IMPRIMIENDO 

FRTETTE MALE E LE 

A eacramenre La misma PIsURa 
MIT ITTTItI] EN cuaATRO POSICIONES 

a aaa ela 


LIGERAMENTE DIFERENTES, 
EMPLEANDO MUEVE CARACTERES 
DEFINIDOS POR EL USUARIO 


Es 
E 
ba 
bid 
E 
bd 
E 
Ll] 
1 
d 









q 
Ej | || 
Ed | | 
A 
+ 
OL 
E 
neo 
q 






[E 
pl 
pd 
ES 
pd 
E] 
$ 
a 
E 
En 
E 
A 











Es 
E: 
ES 
mM 
|] 
A 
E 
E] 
Dn 
4 
+ 






Ñ 
q 
$ 
E 
[E 
PER 
E 


Ed 
i 











7] 
E 
E 
E 
E 
o 
a 
| 


E 
Ll] 
dl 
E 

HH 
E 








ES 111 
7 
ba 
E 























apra 

















¡ 
8 
ES 
$e 
ES 
3 
7] 
a 
E 
7] 
5 








SNA) 


N rn A 7 | É 
V-4E =3 





% 
———_—_—_—_—_—— 
o 





DIA 


Esta sección del programa establece el escenario de fondo de día, la 
casa y el bosque fantasmagórico. También explica las subrutinas del 
programa de control incluida la sección que dibuja los árboles. 











19 





función seno. 


2060 
20160 
ZO25 
2070 
2040 
2050 
2060 
26760 
2080 
2090 
2100 
2110 


2120 





Esta subrutina dibuja el cielo y el primer plano, así como el 
camino que conduce a la puerta del castillo. La línea 10 del 
programa principal había establecido el color de fondo a verde y 
había borrado la pantalla. El bucle entre las líneas 2010 a 2030 
dibuja 100 puntos negros situados en coordenadas aleatorias y 
simulan las piedras sobre el suelo. El cielo lo dibujaremos a base 
del carácter gráfico “MW” (no empleamos el comando PAINT pues 
puede dar problemas al cambiar los colores con el programa en 
código máquina). Es necesario emplear el comando OPEN 
“GRP:” para imprimir dicho carácter, ya que estamos trabajando 
en modo 2 —modo gráfico—. Las líneas 2050 a 2070 son dos 
bucles anidados que se encargan de dibujar el cielo, comenzando 
desde la esquina superior izquierda y terminando en el límite 
impuesto a las piedras del suelo. Las líneas 2080 a 2110 dibujan el 
camino. Este se consigue trazando una serie de líneas horizontales 
cada vez más anchas que comienzan en puntos dados por una 


REM Fondo 

FOR R=1 TO 1896 

X=INT (RND(13x*255): Y=130+INT (RND(1)x66) 
FSE EX. Yi Ls MEJOT 

OFEN "GRF:" AS $1: COLOR S 

FOR Y=98 TO 120 STEF 8: FOR X=0 TO 248 STEF 8 
FRESET (X,Y):FRINTH1,"N" 

NEXT X:NEXT Y 

I=15 

FOR F=6%2 TO O STEF -2 

XL IB ES IMEI) SO Z ESLINE (X.Y CAFE, YO 1 
T=1+1.S: NEXT 

RETURN 


20 





SES, 


00 








REM Castillo 
Xx1=80:Y1=72: X2=158: Y2=120:LAD= 
GOSUB REM Bloque frontal 
x1=64:Y1=40: xX2=80: Y2=80:LAD=79: 
GOSUE 3669: REM Torre izquierda 


E 
$ 


Xx1i=158:Y1=40:xX2=184: Y2=80:LAD=709: 

GOSUB 3600:REM Torre derecha 

xX3=75: YS=8:50S5UB 35300:REM Tejado izquierdo 
Xx3=186: Y5=8: GOSUB 3500:REM Tejado derecho 
FOR Y=6£08 TO 72 

ILENE 189, Y =CL6Z SY) 006 

NEXT 


008 
00 


$ 
6 





El castillo lo dibujamos mediante la subrutina que comienza en la 
línea 2500. Consta de tres volúmenes principales que se consiguen 
mediante la subrutina Bloque que explicaremos posteriormente. 
Antes de entrar en la misma es necesario establecer los 
parámetros que le servirán para determinar los límites de cada 
bloque. Las líneas 2510 a 2530 definen la posición de cada UTINA Edd 
, a LA SUBRUT! 
volumen así como el valor de la variable LAD (que emplearemos OQUE NECESITA | 
para simular el enladrillado) y llaman a dicha subrutina. A BL E PARÁMETROS 
continuación las líneas 2540'y 2550 actúan de forma parecida C/ERT DIBUJAR CADA 
sobre la subrutina Segmento encargada de dibujar los tejados de PA ÚGULO 
las dos torres laterales; establecen el valor del vértice de cada una REC 
y llaman a la subrutina. 
El bucle FOR... NEST entre las líneas 2560 y 2580 dibuja el 
tejado principal mediante unas líneas horizontales entre las dos 
torres. Para dibujar las seis ventanas emplearemos también otra 
subrutina —que comienza en la línea 4000— y que, como las 
anteriores, necesita de dos parámetros que indiquen la posición 
de cada ventana. Por fin la línea 2660 dibuja la puerta a base de 
líneas negras de anchura creciente hasta que alcanzan un máximo 
y lo mantienen. 





2600 X=68: Y=47: GOSUB 40009 

2610 X=76:Y=67:GOSUB 4006 

26206 X=182: Y=47:GOSUB 4000 

2630 X=174: Y=67:GOSUE 4000 

2640 X=96: Y=83:G0SUB 4000 

2650 X=154: Y=83: GOSUB 4090 

2660 FOR Y=104 TO 127: 1F Y:2112 THEN 
LINE (232-Y,Y)-(24+Y,Y),1: NEXT 
ELSE LINE (120,Y)-(136,Y), 1: NEXT 
RETURN 


S 
O 


O 
¡$ 


S 


S 
O 





21 















6 REM Bloque 

6 FOR Y=Y1 TOD Y2 STEF 8:FOR X=X1 TO X2 STEP 3 
6 COLOR 79:PRESET (X,Y):FRINT $1,"B" 

036 NEXT X:NEXT Y 

3046 FOR Y=Y1 TO Y2+7 STEF 2 

LINE (X1,Y)-(X2+7,Y>,1 

NEXT Y 

2076 COLOR 1:FOR M=1 TO LAD 

A=INT (RND(1)x (X2-X1+7)+X1)2 

B=INT (RND(1)*(Y2-Y1+7)+Y1):FSET (A,B),1 
3090 NEXT M E 

RETURN 


SS 
6060 





e 
lod 
NS] 
¿3 





6 
Le 
y 

O 




























NS 
4 
e 
> 
O 








La subrutina Bloque es la encargada de dibujar el frente del 
castillo y las dos torres. El efecto de enladrillado se consigue en 
tres etapas. En primer lugar se dibuja un fondo rojo. Para ello es 
necesario conocer los límites del rectángulo a dibujar; éstos vienen 
dados por X1, X2, Y1 e Y2 y son actualizados antes de entrar en 
la subrutina. Los bucles anidados entre las líneas 3010 y 3030 se 
encargan de dibujar el rectángulo base. La segunda etapa consiste 
en dibujar una serie de líneas negras horizontales sobre el 
rectángulo —líneas 3040 a 3060—; hasta ahora lo que tenemos es 


un rectángulo rayado en rojo y negro. Para terminar el efecto de AL ¡MPRIMIR PUNTOS 
enladrillado dibujaremos una serie de puntos negros sobre el NEGROS ALEATORIOS 
bloque —líneas 3070 a 3090—. Las coordenadas de estos puntos soBRE El PO 
no deben rebasar los límites del muro. Los puntos negros sólo se RAYAS coNsES 


: A : FECTO 
verán cuando estén sobre rayas rojas. es ENLADRILLADO 
La subrutina Segmento —línea 3500— dibuja una serie de radios 
de circunferencia de centro XS, YS —parámetros asignados 
antes de entrar en la subrutina— y simula el tejado de las torres 
laterales. Por fin las ventanas son dibujadas mediante la subrutina 
que comienza en la línea 4000 por un procedimiento análogo al de 
la puerta. 





3500 REM Segmento 
39106 R=38 

3520 FOR T=1698 TO 200 STEP 2 

35306 A=Tx3.14/180: X==RXASIN(A) : Y=RAxCOS(A) 

Za ILTNE (XS. 1SI= ASF As VO= Ye 6 


2550 NEXT 
25056 RETURN 


SS 


O 
S 











4000 REM Ventana 
4610 I=5 

40620 FOR J=Y TO Y+17:1F J<Y+S THEN 

LTNE (X4L/Z,. dd) CX6=1/2.0)0 13 11-12 NEXT 

EESE LINE (Xd) Ext: ds LONEXT 


RETURN 














2 









43506 REM Arboles 

4510 DIM A(Z21) 

4520 FOR J=1 TO 21: READ N:A(J)=N:2NEXT 

4536 FOR J=i TO 21 

4540 I=BASE(10)4+A1J> 

230 VRFOKE (1)¿09VEOKE (I+1), 1SVPOKE (I+327.4325 
VFOKE (1423) ,33:VPOKE (1+64),64: VPOKE (1+65),65 

4566 NEXT J 

457% R=153066: GOSUB 300 

526 RETURN 


6080808 
00060 





O 
S 





Sólo queda añadir los árboles para completar la escena. Esto lo 
lleva a cabo la subrutina que comienza en la línea 4500. El 
proceso ya se ha indicado en la introducción. En primer lugar hay 
que definir la forma de los árboles accediendo a la tabla de 
patrones (ésto ya lo hicimos en la subrutina de inicialización, 
líneas 6540 a 6560). A continuación hay que indicar en la tabla de 
nombres, en cada posición de pantalla que queremos que 
contenga parte del árbol, dónde se encuentra la información que 
define dicha porción. Una vez hecho esto aparecerá el árbol en 
pantalla. 


En primer lugar la línea 4510 DIMensiona la matriz que va a 
contener las posiciones de pantalla correspondientes a la esquina 
superior izquierda de cada árbol. El bucle 4520 asigna a esta 
matriz los valores correspondientes. A continuación el lazo 
constituido por las líneas 4530 a 4560 se encarga de alterar las 
posiciones oportunas de la tabla de nombres para indicar dónde 
se encuentra la definición de cada porción de árbol. La línea 4570 
introduce un retardo que lleva a cabo la subrutina que comienza 
en la línea 300 —un simple bucle FOR... NEXT que cuenta de 
laR. 













Con esta subrutina has completado la parte del programa 
encargada de dibujar el escenario de la acción. 





23 











Debes tener mucho cuidado al proyectar cualquier clase de 
gráficos en el Spectrum, ya que éste no te permite usar mas que 
un color para el fondo y otro para la tinta en cada carácter. La 
subrutina Fondo, que comienza en la línea 2000 borra la pantalla 
y la pasa a color verde (PAPER 4). Un bucle FOR...NEXT elige 
100 coordenadas aleatorias en la mitad inferior de la pantalla y 
dibuja un punto negro en cada una. Estos puntos simulan rocas, y 
ayudan a romper la monotonía del suelo. El cielo se dibuja 
cambiando el color a cyan (PAPER 5) y usando dos bucles 
FOR... NEXT anidados para imprimir una serie de espacios 
coloreados en la mitad superior de la pantalla. La línea 2080 pasa 
la tinta a color negro para dibujar la línea del horizonte que 
separará tierra y cielo. A continuación se fija el valor de la variable 
i a cuatro antes de entrar en otro bucle que se encarga de dibujar 
el camino. Este lo conseguiremos trazando una serie de líneas 
horizontales cada vez más anchas que comienzan en puntos 
dados por una función seno. La anchura creciente se consigue 
incrementando el valor de la variable i que nos da el número de 
pixels que debe contener cada línea horizontal. La subrutina 


finaliza en la línea 2130. 


20608 REM fondo 
PAPER 4: INK 62 TLS 
FOR r=i TO 160 
LET x=INT (RND*255): 
NEXT ri: FPAFER S 
FOR y=98 TO 12: FOR 
PRINT IAT Y." U: 
NEXT x: NEXT y 
INE O 
ELOT 6,72: DRAW 255,6: 
FOR p=39 TO 6 STEF -2 
PLOT 130*SIN (p/30),p: 
NEXT p 
RETURN 


LET y=INT 


x=6 TO 
REM espacio 





(RNDx80): FLOT x,y 


SL 
LET 1=4 


DROW 1,0: LET i=i+2 


24 




























25006 REM castillo 

2510 LET x1i=102: LET x2=21:2 LET yi=16: LET y2=16: 
LET lad=4006: GO SUB 3600: FEM bloque frontal 

2320 LET x1=8: LET x2=162 LET yi=6: LET y2=11: 


S 
O 





O LET lad=106: GO SUB 3606: REM bloque torre izda. 
2330 LET.x1=21: LET.x2=231 LEFT yi=6: LET y2=11: 
LET lad=100: GO SUB 20602 REM bloque torr= dcha. 











Ss 
E 
G 
LET ys=159: 
R 
E 
R 


2340 LET xs=75:1 
90: REM segmento tejado torre izda. 
25590 LET xs=179: LET ys=159: 
GO SUB 35006: REM segmento tejado torre dcha. 
FOR r=88 TO 163 


2570 PLOT 88,r: DRAW 79,0 
2580 NEXT r 


SIMS 
O 








La subrutina castillo, que comienza en la línea 2500, se encarga 
de dibujar el edificio. No obstante es la subrutina bloque —línea 
3000— la que consigue dibujar el enladrillado del frente y las dos 
torres laterales. Las variables x1, x2, yl, e y2 establecen la 
posición del bloque que debe ser rellenado de ladrillos, y se 
estudiarán con detalle en la página siguiente al describir la 
subrutina bloque. Las líneas 2540 y 2550 establecen los vértices 
de los tejados de las torres antes de llamar a la subrutina 3500 
que se encarga de dibujarlos. Un bucle FOR.... NEXT entre las 
líneas 2560 y 2580 dibuja el tejado principal mediante una serie de 
líneas horizontales entre las dos torres. La línea 2590 imprime una 
serie de cuadrados para representar las almenas de la parte 
frontal. El símbolo 8 entre las comillas indica que debes poner el 
ordenador en MODO GRAFICO (pulsa CAPS SHIFT y 9) y 
pulsar la tecla 8. A continuación se dibujan seis ventanas mediante 
la subrutina 4000. Como antes las líneas 2600 a 2650 definen la 
posición de cada ventana antes de entrar en la subrutina que se 
encarga de dibujarlas. Por último la línea 2660 emplea el carácter 
gráfico 8 para imprimir una puerta. Esta consta de cuatro 
caracteres de este tipo. 





23570 FOR b=12 TO 206 STEP 2: 

FRINT AT 14,.b3"8”"s NEXT 63 SEM (€) 
LET x=68: LET y=162: GO SUE 4066 
¿2616 LET x=76: LET y=88: GO SUB 46060 
2620 LET x=182: LET y=102: GO SUB 4000 
LET x=174:2: LET y=88: GO SUB 4600 
2640 LET x=96: LET y=56: 60 SUB 46900 
LET x=157: LET y=56: €O0 SUB 4006 
FRINT AT 15,153"38"34T 15,15;”88": 
REM 18), 1875 68), (8) 

RETURN 









oo 
060808 


6 
bh 
o 
dl 
> 









O 
NA 
So 
58 
O 










e 
t) 
o 
3 

S 











25 












3000 REM bloque 
¿30109 FOR y=y2 TO y1 STEP -—1: FOR x=x1 TO 


3030 NEXT x: NEXT y 


3059 FOR y=y2 TO y1 STEP -2 


306 





7076 NEXT y 
2080 FOR m=1 TO lad 
3096 LET a=INT (RND*(x2=x1+7)+x 1): 


SS 


LA 
o 


NEXT m 
RETUEN 


Ss 


La subrutina bloque se emplea para dibujar el frente de la casa y 
las dos torres laterales. Veamos cómo conseguir el efecto de un 
muro de ladrillos. En primer lugar se dibuja una serie de espacios 
en rojo (PAPER 2) entre los límites dados por las coordenadas 
mediante los bucles FOR... NEXT en las líneas 3010 a 3030. De 
esta forma conseguimos la base del muro. Sobre ésta se dibuja 
una serie de líneas negras horizontales comenzando en pixels 
alternados a lo largo del eje y mediante el bucle entre las líneas 
3050 y 3070. Hasta ahora lo que tenemos es un rectángulo rayado 
en rojo y negro. Para transformarlo en un muro enladrillado 
dibujaremos una serie de puntos negros situados al azar en dicho 
rectángulo. La variable lad contiene el número de puntos a 
distribuir. PLOT a,b, se encarga de dibujar dichos puntos en la 
posición x,y. Estas coordenadas se calculan de modo que se 
encuentren siempre dentro de los límites del muro. Los puntos 
negros sólo se verán cuando se dibujen sobre líneas rojas. De esta 
forma se completa el efecto de enladrillado. La subrutina 
segmento —-que comienza en la línea 3500— se limita a dibujar 
un sector de círculo de radio 39 pixels y de centro las 
coordenadas xs, ys para conseguir los tejados de las dos torres 
laterales. Las ventanas se dibujan en la subrutina que comienza en 
la línea 4000 mediante un lazo que traza una serie de pequeñas 
líneas negras horizontales. 


A————_—_—_—_9==============_——_—— 


33900 REM segmento 
3310 LET r=2309:2: INE 3 
55206 FOR t=156 TO 200 


3946 FLOT xs,ys: DRAW x,y 
23350 NEXT +t 

35966 RETURN 

409 REM ventana 


5011 NEXT w 
4020 RETURN 


060000 


He 


3020 FAPER 2: FRINT AT y,x3" "2: REM espacio 
3040 LET x1=x1%8: LET x2=x2*8: LET yi=y1*8: LET y2=y2x*8 


3050 INK 0: PLOT x1,168-y: DRAW (x2-x1)+7,0 


LET b=168-INT (RND*(y2-y1)+y1): PLOT a,b 






2036 LET a=txP1/186: LET x=rx*SIN (a): LET Y=r*COS (a) 


4018 INE 0: FOR w=y TO y+10: FLOT x,w: DRAw E, 


O 


” 


SS 





SE) 





MURO 
A NCADRILLADO sE ] 
cowvsIGUE DISTRIBUYEND 
PUNTOS NEGROS ALEATORIOS 
SOBRE LOS TRES 
RECTÁNGULOS EN ROJO 
LY NEGRO QUE CONSTITUYEN 


LA CASA 


























30000 











26 


4360 REM arboles 

4519 FAFER 4: INK 0: OVER 1 

4520 FOR t=1 TO 30 

4530 LET x=INT (RND*293: LET y=13+INT (RND*7> 

1540 1F (x>8 AND x<22 AND yx17) THEN GO TO 4536 

4556 FRINT AT y,x3"AB"3AT y+1,x3"CD"30T y+2,x3 "EF": 
REM (8), 1B)3 0). (D)3 tE), (F) 

4566 NEXT t 

4576 OVER 0: FAUSE 200 

245806 RETURN 


O 
O 


SO 
SS 


O 
O 





Sólo queda añadir el bosque siniestro para completar la escena de 
día. La subrutina de la línea 4500 dibuja 30 árboles en posiciones 
aleatorias sobre la hierba. Cada árbol tiene un color verde de 
fondo (PAPER 4); de ahí que sea necesario asegurarse de que no 
se va a imprimir en el cielo —línea 4530— ni sobre la casa 

—línea 4540. 


Cada árbol se compone de seis caracteres, agrupados de dos en 
dos, en tres bloques (línea 4550). La instrucción OVER 1 en la 
línea 4510 tiene el efecto de hacer un carácter transparente, de 
modo que al imprimirlo sobre otro se vean ambos. Cuando parte 
de un árbol se imprime sobre otro es posible ver a través del que 
está en primer plano. Una vez que se han dibujado todos los 
árboles, la instrucción OVER 0 en la línea 4570 recobra la 
impresión normal. 


Tras una pequeña pausa la subrutina finaliza con una instrucción 
RETURN y se devuelve el control al programa principal. Una vez 
que hayas añadido esta subrutina al programa habrás completado 
todas las rutinas que dibujan la escena. 










27 





Prueba tu programa 





Antes de continuar introduciendo la siguiente parte del programa 
conviene guardarlo en cinta (“salvarlo”). Encontrarás las 
instrucciones oportunas en el manual del usuario. Puedes, no 
obstante, probar lo que llevas hecho hasta ahora siguiendo las 
instrucciones de abajo. Si no has cometido ningún fallo al 
introducir el programa verás aparecer el fondo, el castillo y los 
árboles. Si hay algún error repasa tus listados y compáralos con 
los del libro. 


MSX : TECLEA 55 

GOTO 55 Y PRUEBA EL 
PROGRAMA. 

PULSA CTRL-STOP UNA 
VEZ HAYAS COMPROBADO 
QUE EL PROGRAMA 
FUNCIONA CORRECTAMENTE. 
BORRA LA LINEA 55 ANTES 
DE CONTINUAR CON LA 
SIGUIENTE SECCION 





SPECTRUM: TECLEA 55 
GOTO 55, Y PRUEBA EL 
PROGRAMA. PULSA LAS 
TECLAS CAPS SHIET Y 
BREAK UNA VEZ HAYAS 
COMPROBADO QUE EL 
PROGRAMA FUNCIONA 
CORRECTAMENTE. 

-| BORRA LA LÍNEA 55 ANTES 
DE CONTINUAR CON LA 
SIGUIENTE SECCION 











28 





A estas alturas conviene dibujar sobre el papel todos los efectos 
que vayas a introducir. Conoces las dimensiones de la casa, de 
forma que puedes distribuir todas las secuencias animadas a su 
alrededor. Plantéalo todo sobre el papel,.así podrás estudiar si 
alguno de los caracteres colisiona con otro, o si se desplaza a 
algún lugar que no deba. Ten cuidado de no borrar los gráficos 
que ya has dibujado imprimiendo encima de ellos. 


5050 REM Gscuridad 

5610 FRINT USR(G) 

Soz20 FUT SFRITE 4, (15,8,160 
5907306 R=1606: GOSUB 2300 

5046 RETURN 


Para pasar de día a noche debes cambiar alguno de los colores de 
la pantalla. El BASIC del MSX no lo permite con un comando 
directo, de ahí que haya sido necesario introducir un programa en 
código máquina —mucho más rápido— que lo realice. El 
funcionamiento de este programa es muy simple; se limita a 
cambiar todas las posiciones de memoria de la VRAM 


500 REM Rayo 
1510 FOR I=1 TO N 

1520 FSET (240,0):DRAW "C1163ZR16631"” 
1530 POKE 61498!',2H1F:PRINT USRCO) 
1540 R=200:GOSUB 200 

1550 POKE 61498!,2£H14:PRINT USR(09) 
15606 PSET (240,0):DRAW "C1632R16631" 
1570 R=400:GOSUB 2090 

1580 NEXT 1 

15909 RETURN 


306aSs 








300 


O 





sr 


correspondientes a la tabla de colores e introducir en ellas el 
mismo valor, de forma que casi instantáneamente la rutina 
consigue que todos los colores de fondo pasen a azul oscuro y los 
correspondientes a primer término pasen a negro. No obstante 
puedes cambiar estos colores alterando la posición de memoria 
61498 que contiene el valor a introducir en las posiciones de 
memoria anteriores, como luego veremos. 


La línea 5010 pasa el control a esta rutina en código máquina, a 
continuación se imprime la luna en color amarillo colocando el 
sprite 4 en la posición oportuna. Por fin la línea 5030 introduce 
un nuevo retardo basado como antes en la subrutina 300. 


La subrutina Rayo produce un relámpago y dibuja un rayo cuatro 
veces seguidas —tantas como indique el parámetro N—. El rayo 
se consigue mediante la línea 1520, que dibuja una línea quebrada 
amarilla. A continuación la línea 1530 altera la posición de 
memoria que contiene los códigos de colores para la rutina en 
código máquina haciendo que el fondo pase a ser blanco —de 
código de color F— (15 en hexadecimal)— y el primer término 
negro —de código de color 1—; tras ésto se llama a la rutina en 
máquina. Después de un pequeño retardo la línea 1550 restablece 
los colores iniciales y la 1560 borra el rayo dibujándolo de nuevo 


en negro. 





FONDO AZUL OSCURO 


| 
' 
' 
| 
| 











ESOO 


PRIMER | 
TERMINO | 
NEGRO 





AS 





FONDO BLANCO 


LA SUBRUTINA EN CODIGO 
MÁQUINA SE ENCARGA 
DE CAMBIAR 
INSTANTÁNEAMENTE 
LOS COLORES DE 

LA PANTALLA 





PRIMER 
TERMINO 
NEGRO 














3l 


REM Murcielago 

IF Mí50 THEN XM=XM+2:G0TO 5730 

M=M-15: A=M43. 14/1859: XM=120+ INT (40x*SIN(A)): 
Yi=30+ INT” (23x*CD05S(00)) 

PUT SFRITE 1, (XM,YM, 13 

R=96:GOSUB 300:FUT SPRITE 1, (6,209) 

RUT SERTTE 2, (XM, YM), 13 

R=20:GOSUB 3002: PUT SPRITE 2,(0,209) 

RETURN 


0000 


El movimiento de la bruja y el murciélago lo controlan las líneas 80 
a 130 del programa principal. La subrutina Murciélago —línea 
500— emplea la variable M para calcular la trayectoria entre las 
dos torres. Inicialmente vale 1300 —línea 80— y cada vez que se 
ejecuta esta subrutina se decrementa 15.unidades. Cuando M 
supera cierto valor la línea 520 calcula sus coordenadas, que 
corresponden a las de una elipse, y actualiza el valor de M. Si no 
lo supera, la línea 510 habrá modificado XM para que el 
murciélago siga a la bruja. La línea 530 coloca el sprite 1 
—murciélago con las alas abiertas— en dicha posición y tras un 
retardo la línea 540 lo borra de la pantalla haciendo que su 
posición vertical valga 209. A continuación se repite el mismo 
proceso con el murciélago con las alas cerradas —líneas 

550 y 560. 


1000 REM Bruja 

1010 YB=32+24x*SIN(XB*2x3. 14/2549) 
1020 PUT SPRITE 3,(XB,YB),3 
1030 RETURN 


El movimiento de la bruja es más simple pues su coordenada 
horizontal es incrementada de dos en dos en la línea 90 y su 
coordenada vertical se calcula en la línea 1010 de forma que trace 
una sinusoide en la pantalla. La línea 1020 coloca el sprite 
correspondiente en su posición. Cuando la bruja llega al final de la 
pantalla, la línea 120 del programa principal lo detecta y la hace 
desaparecer. 


Para dibujar el fuego en la casa podríamos haber optado por 
definir el mismo sprite (llama) en diferentes planos y haber 
colocado estos sprites por toda la casa, teniendo en cuenta que 
no puede haber más de cuatro en la misma línea. No obstante se 
ha elegido un procedimiento más ingenioso, ya que con un sólo 
sprite podemos dar la sensación de que el fuego se extiende y la 
casa entera arde. 


En primer lugar la línea 5510 DIMensiona la matriz que va a 
contener las coordenadas x e y de cada llama (estas son tales que 





5506 REM Fuego 

3310 DIM FC(2,6) 

55920 FOR G=1i TC 4 

55306 READ X,Y:F(1,6)=X:F (2,6)=Y 
5540 NEXT G 

5550 N=0 

95664 FOR T=1 TC 4 
5570 N=N+1 

5380 FOR D=1 TO 3 
35539% FOR J=1 TON 
SEDO FUT SPRITE a (FU. EZ ds dl 
5610 FUT SPRITE 5, (0,209) 

620 NEXT J:NEXT DINEXT T 

5630 FOR Y= 8 TO 96 STEF 8:FOR X=56 TO 200 STEF 8 
5640 COLOR 1:FRESET (X,Y):PRINT*1,"LC" 

5650 NEXT X:NEXT Y 


o 


06000000 


el fuego parece salir de las ventanas). Las líneas 5520 a 5540 
rellenan dicha matriz con los datos de la línea 7080. A 
continuación, tres bucles anidados se encargan de animar la 
escena. El fuego se imprime en amarillo en las posiciones dadas 
por F(1,j) y F(2,j) en la línea 5600, y la línea 5610 lo borra; ésto se 
repite 30 veces, de forma que las llamas titilan. Según aumenta N, 


J va tomando distintos valores, lo que hace aparecer una nueva 
llama en otra ventana, hasta que el fuego alcanza la última. 


La casa se derrumba mediante el bucle 5630 a 5650, que imprime 
un rectángulo negro sobre la misma. 





O 


6645 REM Calavera 

é6615 COLOR 15 

60206 CIRCLE (123,40),36,15,0,3.1457:FSET (92,738): 
DRAW"M+20, 56R32M+20,-36"” 

60636 CIRCLE (112,40) ,8: CIRCLE (144,460),8 

606340 PSET(116,64) : DRAW "R4D8R4U4R4D4R4U4R4D4R4U4R4D4R4U 
8R4D1264L 4U41L.4D4L 41/41 4D4L 4U41 4D41L 4H4U 12" 

6056 FSET (126,944): DRAW "Di6H9M+4,-12" 

6660 FSET (12306,44):DRAW "Di£6 ESM-4,-12" 

5070 PAINT (128,5),15,15 

6680 R=3000: GOSUB 2300 

6676 CLOSE +1 

£1006 RETURN 


SO 


08 


La fantasmagórica calavera que se cierne sobre las ruinas de la 
casa se consigue mediante la subrutina Calavera. Gracias al 
macrolenguaje gráfico que posee el sistema MSX podemos crear 
cualquier figura con facilidad. Así, la línea 6020 dibuja el contorno. 
Este se compone de un semicírculo y tres líneas rectas que unen 
sus extremos; todo se dibuja en color blanco (15). La línea 6030 
dibuja los dos ojos y la 6040 la boca a base de una poligonal 
cerrada. Por último, las líneas 6050 y 6060 se encargan de trazar 
dos triángulos que simulan la nariz La sentencia PAINT (línea 
6070) elige un punto interior a la figura y pinta el interior de la 
misma de blanco. Tras un retardo, la línea 6090 cierra el fichero 
que abrimos al principio del programa, mediante una sentencia 


CLOSE. 


300 REM Retardo 
310 FOR K=1 TO R2NEXT 
3206 ¿RETURN 


Unicamente queda analizar la subrutina Retardo que, como 
habíamos apuntado, se limita a contar de 1 a R, con lo que el 
tiempo que tardará en ejecutarse será proporcional al valor de 
esta variable. 


e AI 
E 7 


S 


TURN 








REM oscuridad 

POKE 23761,1: RANDOMIZE USR 2376% 

PAFER 602 INK 6: PRINT AT 3,33"G":308T 4,353"H": 
REM (6): (1H) 

PAUSE 1060 

RETURN 


(A A] 


in 2 


Para pasar de día a noche hay que cambiar algunos colores de la 
pantalla. El BASIC del Spectrum no lo permite, de ahí que haya 
que emplear el código máquina que habíamos introducido. El 
programa en código máquina se activa en la línea 5010; todos los 
pixels correspondientes a tinta se cambian a azul oscuro, y los 
correspondientes a papel a negro. RANDOMIZE USR significa 
“ejecuta el programa en código máquina” que comienza en la 
dirección de memoria indicada. La línea 5020 imprime la luna en 
color amarillo y, tras una pequeña pausa, la subrutina finaliza. 


El programa de control llama ahora a la subrutina rayo que 
comienza en la línea 1500. Una serie de instrucciones PLOT y 
DRAW dibujan una línea negra quebrada desde la esquina 
superior derecha de la pantalla. El rayo no se ve hasta que la línea 
1530 llama al programa en código máquina, que cambia los pixels 
del rayo a blanco (POKE 23761,7). El código máquina cambia el 
color de la luna, de ahí que la línea 1540 la imprima de nuevo en 
amarillo. Esto ocurre tan rápidamente que la luna parece no 


cambiar de color. Después de una pequeña pausa en la línea 1545 
la rutina en máquina vuelve a cambiar el color de la tinta a azul. 
La línea 1560 restablece la luna en amarillo y el rayo se borra 
imprimiéndolo de nuevo en negro. Tras una pequeña pausa se 
repite el bucle otras cuatro veces, ya que habíamos fijado la 
variable n a cinco. 


REM rayo 

FOR 1=1 TO nm 

INK 6: FLOT 255,176: DRAW -27,-4%€: DRAN 10,0: 
DRAW -29,-40 

POKE 23761,7: RANDOMIZE USR 23/69 

INK 6: FRINT AT 3,35"6"30T 4,3 5H": REM (635 (H) 
FAUSE $ 

6 POKE 23761,1: RANDOMIZE USR 23/66 

INK 6: PRINT AT 3,35"G"30T 4,33"8H": REM 

INK 62: FLOT 255,176: DRANWN -39,-40: DRÁN 

DRÁAW -29,-406 

FAUSE 1 

NEXT 1 

RETURN 


$) 


pe pa pos 


sm 


Y 


Cn cn CA 
ji 5 


S 


Oo 


60868 


900 


006 


Oo 





REM murcielago 

IF m<150 THEN  LET xm=xm+1: 60 TO 5230 

LET m=m-8: LET a=m*P1/180: 

LET xm=16+I1NT (4.5*SIN (a)) 

LET ym=4+INT (3.5*C0S la)) 

FAFER 0: INK 7: FRINT AT ym,xm3"R":* REM (R) 
PAJSE 3 . 
FRINT AT ym,xmi3"S"2 REM (5) 

PAUSE 

FRINT AT ym,xmi3" "2: REM esp 

RETURN 


Si analizas las líneas 90 a 130 del programa de control (que 
corresponden a un bucle FOR... NEXT), verás que el murciélago 
y la bruja son animados simultáneamente. La subrutina 
murciélago, que comienza en la línea 500, emplea la variable m 
para calcular las coordenadas de la trayectoria elíptica que sigue 
el murciélago entre las dos torres. 


Sin embargo, antes de realizar ningún cálculo, la línea 510 estudia 
el valor de m. Si éste es menor que 150 el murciélago deja de dar 
vueltas y parece intentar cazar a la bruja. Si m no es menor que 
150, la subrutina salta a la línea 520, donde se emplean las 
funciones SENO y COSENO para dibujar el camino espiral. A 
continuación se imprime el murciélago batiendo sus alas 
alternando los caracteres R y S. 


La bruja se anima de distinta forma al murciélago mediante la 
subrutina que comienza en la línea 1000. Esta subrutina opera de 
la misma forma que la rutina que animaba el avión al comienzo 
del libro, mediante diferentes caracteres definidos por el usuario 
impresos consecutivamente en cada posición de carácter a través 
de la pantalla. 


Antes de imprimir cada grupo de caracteres correspondientes a la 
bruja se llama a la subrutina murciélago. De esta forma 
conseguimos que el movimiento de aquella sea mucho más suave, 
ya que mientras el murciélago se mueve un carácter la bruja sólo 
lo hace dos pixels. De no ser así el movimiento de la bruja sería 
mucho más brusco. 


10006 REM bruja 

1010 FAFER 02 INK 7 

19206 PRINT AT 1,53" 1": GO SUB 560: REM esp, tt), (3) 
1030 PRINT AT 1,b:” EL": GO SUB 500: REM esp, (K), (1) 
1046 PRINT AT 1,03" MN”: GO SUB 500: REM esp, (M>, (N> 
106506 PRINT AT 1,b5" OP": REM esp, (0), (P), (Q) 

1060 RETUEN 














55060 REM fuego 

9910 DIM +4(2,5): INE 46: PAPER 6 

2920 FOR g=1 TO 6 

5930 READ y,x: LET ft1,g)=y2: LET 41(2,9)=x 
5540 NEXT y 

95950 LET n=09 


5560 FOR t=1 TO 4 

557% LET n=n+1 

5586 FOR d=1 TO 230 

55970 FOR j=1 TO n 

5600 PRINT AT 4 (1,3), (2,j)3"T": REM (t) 
56106 PRINT AT 4f(1,3),4(2,3)3" "2 REM espacio 
3620 NEXT j: NEXT di NEXT t 

3630 FOR y=2 TO 11: FOR x=7 TO 23 

5640 FRINT AT y,x3" ": REM espacio 

5650 NEXT x: NEXT y 

5660 RETURN 


35060000060 


La animación de las llamas es bastante ingeniosa. Uno de los 
problemas es que el ordenador no puede tener más de un color 
de tinta y otro de papel en cada carácter. Para resolverlo haremos 
aparecer el fuego desde dentro del castillo, únicamente en las 
ventanas. 


La línea 5510 DIMensiona una matriz, que guardará las 
posiciones de cada carácter correspondiente a una llama (T); 
estas posiciones se ajustan a las coordenadas de las ventanas. Las 
líneas 5560 a 5620 son tres bucles FOR... NEXT anidados. En 
primer lugar se imprime la llama en amarillo en la posición f(1,1) 
cuando j es igual a uno en la línea 5600. La línea 5610 imprime un 
espacio sobre el fuego. Este proceso se repite 30 veces haciendo 
vacilar la llama. Según aumenta n, j toma un nuevo valor, y el 
proceso se repite en cada ventana hasta que las llamas alcanzan 
la última 


La casa se derrumba mediante dos bucles FOR... NEXT 
anidados en las líneas 5630 a 5650 que borran la casa con una 
serie de espacios en negro. 





Go 


60808 


60 








6060 REM calavera 

6610 INK € 

£0620 FOR 270 FO 430 STEFR = 

60306 LET a=s*F1/180: LET x<=30x*SIN (23) 

5040 LET y=40x*C0S (a: PLOT 127,135: DRAN x,y 


6630 NEXT s: LET x1=67: LET x2=80 
6066 FOR y=135 TO 27 STEP -1 
5076 PLOT x1,y:2 DRAW x2,6:2: LET x1i=x1+.23s LET x2=x2-.4 


6080 NEXT y 
60970 FABER Os PRINT AT 65135" —"5AT 4,173" 
REM esp, esp:iesp,esp 
6160 FRINT AT 8,155" ": REM espacio,espacio 
6116 FRINT AT 10,143" "i REM espacio,espacio,espacio 
é61260 FOR y=81 TO 169 STEP 8: FOR x=87 TO 167 STEF 8 
6130 IF FOINT (x,y)=1 THEN FAFER 6: 
INK INT (RND*(73)+1:2 FLASH 1: 
FRINT AT 22-y/3,x/8-13"6": FLASH 0: REM (6) 
NEXT x: NEXT y 
RETURN 


54000000060 


La fantasmagórica calavera que se cierne sobre la casa quemada 
se crea mediante la subrutina calavera. La parte superior es 

un semicírculo que se dibuja en color negro (INK 0) mediante el 
lazo que comienza en la línea 6020, de forma que no se ve en esta 
etapa. El resto de la cara se consigue mediante otro lazo en las 
líneas 6060 a 6080 que dibuja una serie de líneas horizontales que 
se van haciendo cada vez más estrechas según nos acercamos a 
las ruinas de la casa. 


La línea 6090 coloca los ojos con dos espacios en negro, y las 
líneas 6100 y 6110 hacen lo mismo con la nariz y la boca. 


Recuerda que hasta ahora la cara es invisible, ya que está 
coloreada de negro sobre el cielo del mismo color. Para conseguir 
un efecto intermitente emplearemos la función POINT que 
estudia ciertos pixels sobre el área de la calavera. Si el pixel 
corresponde a tinta —en otras palabras, si POINT devuelve el 
valor 1— entonces se imprime el carácter gráfico 6 en esa 
posición con un color aleatorio y de forma intermitente (FLASH 
1). La calavera parece emerger de las ruinas de la casa según el 
lazo la estudia desde la parte inferior hasta la más alta. 


38 


S0500050005 








Almacena tus programas 

A continuación se da el listado completo del programa tanto para 
MSX como para Spectrum. Compruébalos si aún tienes 
problemas. El listado MSX contiene líneas que no aparecen en el 
libro (las que terminan en 5). Estas se han añadido para conseguir 
efectos especiales en la ejecución del programa. Hacen que éste 
sea más tétrico y no lo retardan. 


19 
Lo 
20 
30 
40 
50 
60 
70 
go 
85 
40 
1006 
110 
120 
130 
146 
130 
1506 
170 
300 
210 
320 
306 
s10 
SO 


330 
940 
43 
350 
566 
0 
570 
1000 
1010 
1020 
oa 
1500 
13 1 
1320 
1230 


15935 


1340 
1 
15660 
1570 
1580 
1590 
20060 
2010 


Listados de los programas 


REM Casa Encantada 

CLEAR 260,61482!' 

SUREEN 24 235 COLOR 1,3, 1: CL5 

ON SFRITE GOSUE 8665: SPRITE ON 
GOSUBR £500:REM Inicializar 

GOSUB 2600: REM Fondo 

GOSUB 2500:REM Castillo 

GOSUB 4506:REM Arboles 

SOSUB 3000: REM Oscuridad 

N=4:GOSUB 15060: REM Rayo 

M=1300 

BEEP 

FOR XB=6 TO 254 STEP 2 

GOSUR 5600:REM Murcielago 

GOSUB 10006:REM Bruja 

IF XAB=239% THEN FU SPRITE 3, 10, 209) 
NEXT XE 

N=4: GOSUB 156006: REM Rayo 

GOSUB 5500:REM Fuego 

GOSUB 6600: REM Calavera 

END 

REM Retardo 

FOR K=1 TO R:NEXT 

RETURN 

REM Murcielago 

IF MíS506 THEN XM=XM+2:GOTO 530 
M=M-1 3: A=M*73., 14/1809: XM=120+ INT (40*SIN(A)): 
YM=30+ INT” (23*C0S(A)) 

PUT. SPRATE da CAM, YM. 

R=96: GOSUB 300: FUT SFRITE 1,(0,209) 
PLAY "T153L6458MS00016" 

PUT SBPRLITE Ly (XML, YD A 1 

R=20:GOSUB 300: PUT SPRITE 2,(0,209) 
PLAY "8" 

RETURN 

REM Bruja 

YB=3 24 24xSIN(XBx24%, 14/2549) 

PLUS SFRITE AB, YE), 2 

RETURN 

REM Rayu 

FOR 1I=1 TO N 

PFSET (240,6):DRAW "Ci1632R166G31" 
POKE 61498'*,2%H1F:FRINT USR(O) 

SOUND 3%,€: SOUND 1,6: SOUND 2,6: SOUND 3,0: SOUND 4,06: 
SOUND 3,0: SOUND 6,31: SOUND 7,7: SOUND 8,146: SOUND 2, 
16:SOUND 19,16: SOUND 11,6:SOUND 12,66: SOUND 13,0 
R=200: GOSUB 2600 

POKE 61493',2H14:PRINT USR (0) 

PSET (240,0): DRAW "C16G32R16631" 
R=400: GOSUR 300 

NEXT 1 

RETURN 

REM Fondo 

FOR R=1 TO 106 





Continuación MSX 


2020 
2030 

2040 
2050 
2060 


-— 2070 


2030 
2090 
2100 
21109 
120 
2300 
210 


300 
20360 
3046 
3030 
30560 
2070 
30890 


2090 
3100 
35300 
y IE 
Ed 
3536 
3540 
do 
35960 
4000 
4010 
4020 


4030 
4300 
4510 
4520 
4530 
4340 
4550 


45409 
4570 
43286 
5090 
3010 
5020 
5030 
50406 
3300 
33109 


X=INT (RND(1)x255): Y=130+INT (RND(1)x050) 
PSET ¿Xs Y) ¿ 1ENEXT 
OPEN "GRP" AS +1: COLOR 5 
FOR Y=06 TO 126 STEP 8:FOR X=0 TO 248 STEF 8 
FPRESET (X,Y):FRINTH1,"N" 
NEXT X: NEXT Y 
I=16 
FOR F=63 TO € STEP -2 
X=138*SIN(P/60): Y=192-P:LINE (X,Y)-(X+I,Y),1 
1=1+1.3:NEXT 
RETURN 
REM Castillo 
x1=80:Y1=72: xX2=158: Y2=120:LAD=300: 
GOSUBE 30606: REM Bloque frontal 
X1=64: Y1=40: X2=80: Y2=80:LAD=709: 
GOSUBE 30669: REM Torre izquierda 
xX1=158:Y1=40:x2=184: Y2=80:LAD=70: 
GOSUB 30606:REM Torre derecha 
XxS=75: YS=8:G0SUB 3500:REM Tejado izquierdo 
Xx3=180: YS=8:GOSUB 3560:REM Tejado derecho 
FOR Y=60 TO 72 
LINE (89,VY)- (147, Y,56 
NEXT 
X=68: Y=47:GOSUB 4009 
X=75: Y=572: GOSUB 4506 
x=182: Y=47:GOSUB 40590 
x=174: Y=67:GOSUB 4000 
Xx=96: Y=873:GOSUB 4600 
x=154: Y=83: GOSUB 40960 
FOR Y=104 TO 127: 1F Y<112 THEN 
LINE (232-W, Y)-(244+Y,Y),1: NEXT 
ELSE LINE (120,Y)-(136,Y),1:NEXT 
RETURN 
REM Bloque e 
FOR Y=Yi TO Y2 STEF 8:FOR X=X1 TO X2 STEP 8 
COLOR 9:PRESET (X,VY):PRINT $€1,"p" 
NEXT X:NEXT Y 
FOR Y=Y1 TOD Y2+*7 STEP 2 
LBNE 1X141I1=(X2387.W>.1 
NEXT Y 
COLOR 1:FOR M=1 TO LAD 
A=SINT (RND(1)x(X2-X14+7)4X1)2 
B=INT (RND(1)x*(Y2-Y1+7)+Y1):FSET (A,B)>,1 
NEXT M 
RETURN 
REM Segmento 
R=38 
FOR T=160 TO 200 STEP 2 
A=T*3. 14/1806: Xx<=RxSIN(A) : Y=R*XCOS (A) 
LINE (XS,YS)-(XS+X, YS-Y),6 
NEXT 
RETURN 
REM Ventana 
I=5 
FOR J=Y TO Y+17:1F J<Y+S THEN 
LINE (X+1/2,3)-(X+6-1/2,3),1:1=1-1:NEXT 
ELSE LINE (X,J3)-(X+6,3),1: NEXT 
RETURN 
REM Arboles 
DIM A(21) 
FOR J=1 TO 21:READ N:A(J)=N:*NEXT 
FOR J=i TO 21 
I=BASE (10)+A(J) 
VPOKE (1),0:VPOKE (1+1),1:VPOKE (1+32),32:7 . 
VPOKE (1433),33:VPOKE (1+64),64: VPOKE (1+45),65 
NEXT J 
R=1000: GOSUB 300 
RETURN 
REM Oscuridad 
PRINT USR(0) 
PUT SPRITE 4, (16,8),10 
R=1000: GOSUB 300 
RETURN 
REM Fuego 
DIM F(246) 





Continuación MSX 


3920 

036 
33040 
3330 
35060 
3970 
3380 
3590 
3600 
3603 


FOR G=1 TO 4 

READ X,Y:F(1,6)=X:F (2,6)=Y 

NEXT G 

N=0 

FOR T=1 TO 4 

N=N+1 

FOR D=1 TO 30 

FOR J=i TON 

PUT SPFRITE ue (Fl. Files), 11 

FOR W=i TO INT(RND(-TIME>)%30):NEXT YW: 

Z= INT (RND(-TIME)*150)+2:SDUND 6,Z: SOUND 1,15: 
SOUND 65,5:SOUND 7,£B10110110: SOUND 8, 16: SOUND 
: SOUND 13,4 

PUT SPRITE 3, 10, 207) 

NEXT J:NEXT D:¿NEXT T 

FOR Y= 8 TO 96 STEF 8:FOR X=564 TO 206 STEF 8 
COLOR 1:<PRESET (%X,Y)3FRINTH1,"L" 

NEXT X:NEXT Y 

REM Calavera 

COLOR 15 

CIRCLE (128,468),36,15,0,3. 19357%:PSET (92,38)3 
DRAW"M+20, 56R32M+20,-S56" 

CIRCLE (112,40),8: CIRCLE (144,460),8 
PSET(110,64) : DRAW "R4D8R4U4R4D4R4U4R4D4R4U4R4D4R4U 
8R4D1 2G6G4L 4U4L 4D4L 4U4L 4D4L 4U4L 4D4L 4H4U12" 
PSET (126,44): DRAW "D146H4M+4,-12" 

PSET (130,44):DRAW "D16 E4M-4,- 12" 

PAINT (128, 0)+1302 12 


S BEEP:FLAY "TI6S1MIGODOD1A/A8. A244072C8.D1B16BE8.A164 


8.416A2" 

R=:3000: GOSUB 300 

CLOSE +1 

RETURN 

REM inicializar 

FOR I=61483!' TO 61508! 

READ N$:FOKE I1,VAL("2RH"+N$) 2: NEXT 

DEFUSR=41 483! 

FOR I=BASE(12) TO BASE (12)+15:READ N: 

VPOKE (1+4096),N: NEXT 

FOR I=BASE(12) TO BASE (12)+15:READ N: 

VPOKRE  (1+24332) . ME NEAT 

FOR I=BASE(12) TO BASE(123)+13:READ N: 

VPOKE (1+45089),N: NEXT 

FOR I=BASE (14)+32 TO BASE (14)+191:READ N: 

VPOKE 1,NsNEXT 

RETURN 

DATA DB,99,21,00,20,0E,979,ED,6579,ED,61,21,00,00,3JE, 
14,03, 98,23, 70, FE,18,82,57+F0,L73REM Lod. maquina 

DATA 16,129,7/3,40,16,80,49,9,128,321/4,154, 164,60, 

204,30,5,38, 178, 27,31, 15,3,3, 48, 96,192,192,1794,242 
,152,128,1,1,1,3,3,7,31,31,192,192,192,128,128,128 
12294,2092: REM Arbol 

DATA 6,0,0,16,56,1235,239,63,153,3,2,0,0,0,0,9,0,0,0 
,8,28,190,255,252,240,192,64,0,0,0,0, dead Mura. 1 

DATA o, 0,095,0,0,13,31» 63,63,67,26,724, 8,0,0,0,0,0,0s 

0,0,175, 248, 252, 232,232 98,2%4,16,0,05 5 EEN Murc.2 

DATA ES 1, Os o, o, 1,3,159, 207,255, 195,129, 140, 0,0, 120 
,192,96,96,224,192,192,224,240,255,192,128,128,192 
19,0: REM Bruja 

DATA 3,149,208) 504 122,120, 204.200 23931 218,2980,761, 1092 
sd. 31. 310,1010,0, 12970,0,120, 120,0, 0,7% 12,152,248, 

24012 REM Lunar 

DATALOs ¿24 325. ds 0. 301,314 127,120, 2364 2208) LOW, y ul 
.72a7184,0,17/,17,1479,1139,227,167,1067,171,185,1069,2005 

208,224, 224: REM Llama 

DATA 521,535,5406,547,550,562,565,570,580,592,600, 

610,637, 540, 5857,061+4657,068610671,6764 700: 

REM Pasion Sas 

DATA 177,48,169,64,1479,84,91,84,71,064,623,48: 

REM Posicion llamas 

FOR R=8S TO 256 STEP 155FOR T=1 TO 166 STEF 260: 
FOR A=1 TO T+15 STEP -15:SOUND 0,R-T:SOUND 1,8: 
SOUND 7,254: SOUND 8,16: SOUND 12,5:SOUND 13,1: 

NEXT A:NEXT T:NEXT R:SPRITE OFF: BEEP: RETURN 





SPECTRUM 


E 
Y) 


10 
11 


20 
30 
460 
50 
60 
70 
380 
20 
100 
110 
120 
130 
140 
150 
160 
170 
500 
310 


320 


930 
pi 
340 
545 
3500 
560 
1000 
1010 
1070 
1030 
1046 
1050 
1065 
1506 
1510 
1520 
1305 
15%0 
1545 
1553 
1566 
1570 


15753 
1580 
1590 
2000 
2010 
ZOZO 
ZOJFO 
2040 
2050 
2660 
2070 
20809 
20790 
210060 
21 
2120 
21360 


2900 


REM 4 e 

REM casa encantada : 

REM 18 bytes de codigo mequima almacenados en la 
linea 5 

GO SUR 6360: REM inicializar 

GO SUB 20606: REM fondo 

GO SUB 250602 REM castillo 

GO SUB 4500: REM arboles 

GO SUB 5006: REM oscuridad 

LET n=5: 60 SUB 1500: FEM rayo 

LET m=1330 

FOR b=6 TO 29 

GO SUE 506: REM murcielago 

GO SUB 10060: REM bruja 

IF b=29: THEN  PRINT. AT 1,295" "2 REM =sp,esp,esp 

NEXT b 

LET n=S: GO SUB 1506: REM rayo 

GO SUB 5500: REM fuego 

GO SUB £0006: REM calavera 

Sue E 

REM murcielago 

IF m<150 THEN LET xm=xm+1: GO 

LET m=m-89: LET a=mXxF1/180: 

LET xm=16+INT (4.5*SIN (a)) 

LET ym=4+INT (3.S5*COS la)) 

PAFER 05 TM 7IIFPRIMT AT ym,xm3"R"+* REM (R) 

PAUSE 3 

PRINT AT ym,xm3"S"2z REM (5) 

PAUSE 3 

FPRINT AT ym,xm3" ": REM esp 

RETURN 

REM bruja 

PAPER 0: 

PRINT AT 

FPRINT AT 

PRINT AT 

PRINT AT 

RETURN 

REM rayo 

FOR i=1 TO mn 

INK 62 FLOT 255,170: DRAW -39,-46: DRAW 10,0: 

DRAW -29,-40 

POFE 23761,7: RANDOMIZE USR 23760 

INE 6: PRINF AT 3,355"6 380T.%,3 3. HS: REM (635 (H) 

FAUSE 5 

POKE 23761,1: RANDOMIZE USR 237660 

INE £:, PRINT AT 3,33 "6 381 %,.303 HL REF 1633 CH 

INK 602 FLOT 255,170: DRAW -39,-46: DRAW 19,0: 

DRAW -27,-40 

FAUSE 1 

NEXT 1 

RETURN 

REM fondo 

PAPER 43 INK 6: CLS 

FOR r=i TO 100 

LET x=INT (RND*255):2 LET y=INT (RND*80): FLOT x,y 

MEXT FE PAPER 

FOR y=09 TO 12: FOR x=06 TO 31 

PRINT AT y,x3” ": REM espacio 

NEXT x:3 NEXT y 

INK 0 

FLBT 6,2: DRA 2539, % LET. 1=4 

FOR p=37 TO 6 STEP -2 

PLOT i30*SIN (p/30),p: DRAW 1,0: 

NEXT p 

RETURN 

REM castillo 

LET uli=10: LET «2=21s LET yl=10: LET ye<-=161 

LET lad=406: GO SUB 3600: FEM bloque frontal 

LET x1=8: LET x2=16:2: LEY yi=6: LET y2=11: 

LET lad=106: GO SUB REM blogue torre izdá. 

LET xi=2l8 LET «a2=25%1 LET yi=682 LET y2=l1i: 

LET lad=160: GO SUB 23060: REM bloque torre dcha. - 


Ls 
dl e la 


- 
- 


14": 60 SUB 500 
KL”": 60 SUB 500 
o 


¿ REM. SSP» la td) 

: REM esp, (K), 11) 
MN": GO SUB 500: REM esp, (M), (N> 
OPC”? REM esps, (0), 1F)., 1010 


4 
A 
- - 
- - 


po quo dr o 


e u e] 





Continuación Spectrum 


LEÍ. NS=/01 LET ya=13%3 
50 SUB 3500: REM segmento tejado torre 
LET xs=179: LET ys=159: 
GO SUB 3500: REM segmento tejado torre 
FOR r=88 TO 103 
PLOT 88,5 DRAW 77,0 
MEAT 
FOR b=12 TO ZO STEP <: 
PRINT AT. .11,4B5"S 5. NEAI Es REM 13. 
LEI *»=68:%: LET y=182: 60 SUR 40606 
LET x=76: LET y=88: GO SUB 4000 
LET x=182: LET y=i102: GO SUB 400060 
LET x=174: LET y=88: GO SUB 46006 
LET x=96: LET y=56: 60 SUB 4006 
zZ630 LET Xx51572 LET y=56: 6D SUB 460060 
26064 PFRINT AT 13,139”88 A ló,s,los 28: 
REM (87, (1D 19), 18) 
267060 RETURN 
3000 REM bloque 
SLO FOR vesye¿ TO yl STEF —15 POR x=:91 TO =2 
3020 FAFER 2: PRINT AT y,x3" ": REM.espacio 
000 MEXT ME NEXT y 
20040 LE? xi=x1%58s2 LET. x2=x2*9s LET yi=y1*8: LET y2=y2*B5 
030 FUR y=y2Z TO" yl: STEP =< 
300 INE €s PLOT x1,168-y3 URAN (x2-x13+7,0 
0706 NEXT y 
2080 FOR m=1 TO lad 
00 LEFT aS= INT (RND*t=2=x1+/)+81)5 
LET b=168-INT (RND*(y2-y1)+y1): PLOT a,b 
31060 NEXT m 
2110 RETUEN 
32900 REM segmento 
2010 LET r=3921 INK 3 
35920 FOR t=166 TO 200 
2536 LET a=txP1/186: LET x=r*SIN (a): LET y=r*C0S 
3946 FLOT xs,ys: DRANW x.y 
33990 NEXT t 


356646 RETURN 
4000 REM ventana 


40168 INE 0: FOR w=y TO y+10: FLOT »x,w: DRAWN 23,0 
2011 NEXT w 
4020 RETURN 
43600 REM arboles 
4510 FAFER 4: INK (O: OVER 1 
45920 FOR t=1 TO 3060 
4936 LET x<=INT (RND*293: LET y=13+INT  (RND*7> 
340 1F t828 AND x<22 AND y17) THEN 60 TO 4530 
43500 FRINT AT y,»3"AB"3A7 y+1,x3 "CD"paT SEZA E ERE 
REI 18), 1E9 3 Gs 1018 15). 15) 
945366 NEXT t 
4976 OVER 0: FAUSE 20060 
586 RETURN 
506060 REM oscurided 
20160 POKE 2<3/61,1: RANDOGMIZE USRK 22766 
JazoO PAPER Oy INE 6: PRINT AT 3,433"6"34A1 4.33 Hs 
REM (6G)3(H) : 
5030 FAUSE 100 
250496 RETURN 
9500 REM fuego 
910 DIM +t(2,6l3 INE 613 FAFES € 
2o20 FOR g=1 TO 6 
aa E ¿t LES Pt. =yi LET Fi. D)=xX 
55490 


5550 


a 
Ae 
Suda 
TO 
5600 ERINT AT A IN E AS 
616 PRINT Al FllzsidetIcsJos Ss. REN espacio 
3620 NEXT:335 MEAT d5 NEXT € 
5630 FDR. ye2 TO 113 FOR s=7 10 Lo 
5640 PRINT 47 y,x3" "3: REM espacio 
SOJO.NEAT «xs» NEXT y 
5660 RETURN 
60606060 REM calavera 





Continuación Spectrum 


66010 
6020 
60730 
5040 
66050 
6666 
5070 
6080 
6970 


6100 
6110 
6120 
6130 


-6140 
6150 
6500 
6510 


52 
A 


550 
65409 
79005 
7010 
7020 
70:30 
7040 
7050 
70606 
7070 
7030 
70790 
7100 
7110 
7120 
71:30 
7140 
TIOS 
7160 
7170 
7180 
7190 
7300 
7310 
7320 
73930 
7540 


INK 0 

FOUR s=270 TO 450 STEP 2 

LET a=s*F1/180: LET *=40*SIN (23) 
LET y=40LOS ta)? FLOT 12/,1353 
NEXT s: LET x1=87: LET x2=806 
FUR y=133 716 7 Se =1 

PLOT xi,zys DRAW x2,02 LET xi=xi+.3: LET x2=x2-.4 
NEXT y 

PAPER UU; PRINTS” "¡AT 56,173” 

REM esp, esp;esp,esp 

FRINT AT 8,153" "2: REM espacio,especio 

PRINT AT 10,143” ": REM espacio,espacio, espacio 
FOR y=81 TO 169 STEP 8: FOR x=87 TO 167 STEF 8 
IF FOINT (x,y)=1 THEN FAFER 6: 

INE INT (RND*(7))+1:2 FLASH 1: 

PRINTER BD 10-15"6": FLASH-6: REM (6) 

NEXT x:z WEXT y 

RETURN 

REM inicializar 

FOR a=65368 TC £5527: READ de: FOKE a,d: NEXT a 
REM introducir codigo maquina en la sentencia 
REM de la linea S 

FOR i=23760 TO 23777: READ d: FOKE i,d: NEXT i 
RETURN 

DATA 16,129,773,40,15,80,48,79: REM arbol (A) 

DATA 128,32,74,134,164,68,204,30: REM arbol (B) 
DATA SIB id. 22 REM arbol (0) 


DRAN x,y 


DATA 48,96,192,192,192,244,152,128: REM arbol (D) 


DATA 1,1,1,3,3,742 2 605 REM arbol (E) 

DATA 192,192,192, TRA IEA 120, 224, 2321 REM arbol tF) 
DATA 3,16,48,32,76,76,233, 224: REM luna (6) 
DATA 246,254,127,1173,48,54,31,6: REM luna (H) 
DISTA 1, 216:230,17,2313417,2253 REN bruja (P) 
DATA 0,6,6,128,240,179,0,0: REM bruja (3) 
DATA 9,0,1,57,4,31,4,506:2 REM bruja (1K) 

DATA 64,128, 128,150, 252,224,64,128: REM bruja (L) 
DATA 06,0,0,14,1,7,1,14: REM bruja (M) : 
DATA 16,32,96,164,63,248,16,32: REM bruja (N)> 
DATA 0,9,0,3,0,1,0,3: REM bruja (0) 

DATA 4,8,24,154,79,254,68, 136: FEM bruja (FP) 
DATA 9,0,9,60,192,0,0,0: REM bruja (0) 

DATA 0,0,0,66,36,214,24,0: REM murcielago (R) 
DATA 0,0,0,0,0,2559,24,6: REM murcielago (S) 
DATA 8,128,65,2,150,68,40,40: REM llamas (T) 
REM datos codigo maquina 

DATA 62,0,33,0,88,6,24,197,6,32 

DATA 119,335,16,2352¿173,16, 206,201 

REM datos posicion ventanas 

DATA 10,22,8,23,14,19,14,12,10,9,8,8 
































SS ARA : 
. — ESTA » NUEVA SERIE Cl E CONSTITUYE LIN LUNA INTRODUCCIÓN 
AL ARTE DE PROGRAMAR ORDENADORES: CADA LIBRO 





SMO ESTRUCTURAR EN PROGRAMA EN A A 


% | A ENSEÑA C CÓN 
ES e RUTINAS. >S AL MISMO TIEMPO EXPLICA Da ANALIZA 


SE ES PIDE AL ORDENADOR QUE HAGA E 












e Lo QUE 
| POR QUÉ. : 
| E 
__— PEA . 
EEtE iy ADEMÁS E ES ONVERTIDO! CADA 1 LIBRO > CONTIENE E 
| como MÍNIMO UN WLIEGO. DE ORDENADOR, 
| _APASIONANTE Y ORIGINAL, ! ESTRUCTURADO [ DE 
a | TAL MODO QUE PUEDE AMPLIARSE O REDUCIRSE, 
E p DE ACUERDO CON EL NIVEL 0108! DESEOS DEL 
des | USARIO. 
> Lay e A 0 -_ is mn SS A 
7 E 
S AN 





e TÍTULOS DE LA SERIE 


Gráficos - ici LÓ 
Iniciación al basic - El banco d 
o de datos 


es Animació ] 
ión - Sonido - Gráficos móviles 


000000000000 00090 


APRENDE A PROGRAMAR 


NIMACIÓN 





Marcus Milton 





ANAYA